// TODO: 将一个正常的对象转换为每个层级的属性都是响应式（可以被侦测）的object
import { def } from './util'
import defineReactive from './defineReactive'
import { arrayMethods } from './array'
import observe from './observe'
import Dep from './Dep'

export default class Observer {
    constructor(value) {
        // 1 将 Observer实例对象 挂载到参数对象上
        def(value, '__ob__', this, false)
        // 2 数组：改变原型指向
        if (Array.isArray(value)) {
            Object.setPrototypeOf(value, arrayMethods)
            // 遍历数组
            this.observeArray(value)
        }
        else {
            // 3 对象：遍历参数对象
            this.walk(value)
        }
        // 3 每个实例都需要有一个Dep实例
        this.dep = new Dep()
    }

    // TODO：遍历数据转换为响应式
    walk (value) {
        for (let key in value) {
            defineReactive(value, key)
        }
    }

    // TODO：遍历数组转换为响应式
    observeArray (arr) {
        for (let i = 0, len = arr.length; i < len; i++) {
            // 逐项observe
            observe(arr[i])
        }
    }
}